//和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 
//
// 现在，给你一个整数数组 nums ，请你在所有可能的子序列中找到最长的和谐子序列的长度。 
//
// 数组的子序列是一个由数组派生出来的序列，它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。 
//
// 
//
// 示例 1： 
//
// 
//输入：nums = [1,3,2,2,5,2,3,7]
//输出：5
//解释：最长的和谐子序列是 [3,2,2,2,3]
// 
//
// 示例 2： 
//
// 
//输入：nums = [1,2,3,4]
//输出：2
// 
//
// 示例 3： 
//
// 
//输入：nums = [1,1,1,1]
//输出：0
// 
//
// 
//
// 提示： 
//
// 
// 1 <= nums.length <= 2 * 10⁴ 
// -10⁹ <= nums[i] <= 10⁹ 
// 
//
// Related Topics 数组 哈希表 排序 👍 333 👎 0

package leetcode.editor.cn;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class _594_LongestHarmoniousSubsequence {
    public static void main(String[] args) {
        Solution solution = new _594_LongestHarmoniousSubsequence().new Solution();
        int[] nums = {1, 3, 2, 2, 5, 2, 3, 7};
        System.out.println(solution.findLHS(nums));
    }

    class Solution {
        public int findLHS(int[] nums) {
            Map<Integer, Integer> map = new HashMap<>(nums.length);
            for (int num : nums) {
                map.put(num, map.getOrDefault(num, 0) + 1);
            }
            int res = 0;
            for (Integer integer : map.keySet()) {
                if (map.containsKey(integer + 1)) {
                    res = Math.max(res, map.get(integer) + map.get(integer + 1));
                }
            }
            return res;
        }
    }

    class Solution2 {
        public int findLHS(int[] nums) {
            Arrays.sort(nums);
            int begin = 0;
            int res = 0;
            for (int end = 0; end < nums.length; end++) {
                while (nums[end] - nums[begin] > 1) {
                    begin++;
                }
                if (nums[end] - nums[begin] == 1) {
                    res = Math.max(res, end - begin + 1);
                }
            }
            return res;
        }
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution1 {
        public int findLHS(int[] nums) {
            int res = 0;
            for (int i = 0; i < nums.length; i++) {
                int count_self = 1;
                int count_jiaYi = 0;
                for (int j = 0; j < nums.length; j++) {
                    if (i == j) continue;
                    if (nums[j] == nums[i] + 1) {
                        count_jiaYi++;
                    }
                    if (nums[j] == nums[i]) {
                        count_self++;
                    }
                }
                if (count_jiaYi != 0) {
                    res = Math.max(res, count_self + count_jiaYi);
                }
            }
            return res;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}